Due to the limited performance of the computer systems, combined with the limited bandwidth of communication networks that connected such systems to the real world, software traditionally fell into two broad categories: application software, and real-time software. Application software typically performs functions that can be very complex, but is relatively slow and cannot guarantee responses within predictable and short intervals of time. Real-time software, on the other hand, performs functions that must be completed quickly and within guaranteed time intervals, such as controlling hardware, communicating data over networks, and interacting with non-computing equipment. The need to provide very high performance and guaranteed response times dictated that real-time software be limited to functions that were simple in nature.
As computer systems become networked, more and more of the functions of the system become related to receiving requests over a communication network, handling such requests by using the data and resources available in the local computer or, alternatively, by generating network requests to yet other computer systems, and responding to the systems that originated such requests. In a fully networked world, all computers are network servers.
As network speeds increased from 100 Megabit/sec to 1 Gigabit/sec and now to 10 Gigabit/sec, the number of requests that a particular computer may receive increase accordingly. As more and more of the computing functionality is being exposed through a network, the functions expected in response to each such request increase in sophistication and complexity. The result is that the traditional division between application software and real-time software is becoming increasingly blurred—more and more complex applications are facing the need to respond in real time, while more and more real-time systems are faced with the need to implement sophisticated, highly stateful interactions that require significant complexity.
A good overview of existing object-oriented and composition-based methods and systems for building software is provided in U.S. Pat. No. 6,226,692, Miloushev et al., “Method and System For Constructing Software Components and Systems As Assemblies Of Independent Parts” (including, but not limited to, its background discussion). Other suitable examples of the current art include published U.S. Patent Application 20020069400, Miloushev et al., “System Of Reusable Software Parts For Supporting Dynamic Structures Of Parts and Methods Of Use”, and published U.S. Patent Application 20030135850, Miloushev et al., “System of reusable software parts and methods of use”.
Existing “high-level” software development methodologies such as object-oriented software, and composition-based software design were designed for the needs of application developers where the main challenge is exploding complexity in environments which are either not time critical (e.g. most enterprise applications), or mild real-time environments in which required response times are measured in milliseconds (e.g. telephony control applications), or hundreds of microseconds.
Accordingly, existing software development methodologies focus on managing system complexity and developer productivity. Emphasis is made on componentization, with the ability to partition software into reasonable-size components that can be implemented separately, extract components from existing systems for reuse in new software so that development cost can be contained, and ability to test components separately to manage quality in large systems.
Software component technologies are typically based on a runtime component management infrastructure layer which abstracts component classes, instantiates components, configures and parameterizes them and manages interactions between component instances. All of these functions take significant amount of time, but deliver increased modularity, configurability and promote software reuse.
Today, however, a single 10 Gbps network connection can deliver to a computer more than 100,000 application-level XML documents per second, each document containing more than 10 KB of data. To keep the system running, the software that handles such requests must receive, decode, analyze and respond to an equivalent of a 5-page text document within 10 microseconds or less, an interval of time in which a modern CPU can process only about 5,000 to 10,000 instructions.
It is clear that designers of such software face requirements that call for application-level complexity to be handled with real-time response times, on hardware that combines a large number of processors (or independently operating processor cores in a multicore processor) to deliver adequate processing power.
Existing software development methodologies by a wide margin cannot handle such requirements. The overhead of component-based software is prohibitive to a degree that forces designers to compromise good design practices in order to achieve acceptable performance, leaving them as a result without ability to handle software complexity. Application-level concurrency models make it exceedingly difficult to produce code that performs well on a single CPU while scaling linearly to large processor counts.
What is missing is a method and system for designing and developing sophisticated software with typical complexity equivalent of 50-500 object classes, which is capable of processing high rates of input requests, typically in the range of 10,000 to 100,000 requests per second.
Solving such challenge requires a combination of proven design methodologies that are suitable for handling complexity, such as object composition, with development technology that can produce high-performance code while delivering the degree of parallelism required to execute well on multiple processors.